package org.example.动态代理;

import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class cglib动态代理 {

    public static class Student {
        public void handOut() {
            System.out.println("学生交作业。");
        }
    }

    public static class CglibProxy implements MethodInterceptor {

        /**
         * @param o: 代理对象
         * @param method: 被代理方法
         * @param params: 方法入参
         * @param methodProxy: CGLIB方法
         **/
        @Override
        public Object intercept(Object o, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
            System.out.println("【增强方法】代理对象正在执行的方法：" + method.getName());
            System.out.println("这里可以插入执行关键代码之前的逻辑");
                Object result = methodProxy.invokeSuper(o, params);
            System.out.println("这里可以插入执行关键代码之后的逻辑");
            return result;
        }
    }

    public static class CglibProxyFactory {
        public static Object creatCglibProxyObj(Class<?> clazz) {
            // System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\code");
            Enhancer enhancer = new Enhancer();
            // 为加强器指定要代理的业务类（即为下面生成的代理类指定父类）
            enhancer.setSuperclass(clazz);
            // 设置回调：对于代理类上所有方法的调用，都会调用CallBack，而Callback则需要实现intercept()方法
            enhancer.setCallback(new CglibProxy());
            return enhancer.create();
        }

    }

    public static void main(String[] args) {
        Student studentProxy = (Student)CglibProxyFactory.creatCglibProxyObj(Student.class);
        studentProxy.handOut();
    }
}
